# .列表的常用操作
#  下标
ame_list = ['Tom','Lily','Rose']
print(ame_list[0])

# index(): 返回指定数据所在位置的下标。
print(ame_list.index('Lily'))

# count(): 统计指定数据在当前列表中出现的次数。
print(ame_list.count('Lily'))

# len(): 访问列表长度,即列表中数据的个数。
print(len(ame_list))

# in: 判断指定数据在某个列表序列,如果在返回True,否则返回False
print('Lily' in ame_list)

print('Lilys' in ame_list)

# not in: 判断指定数据不在某个列表序列,如果不在返回True, 否则返回False
print('Lily' not in ame_list)

print('Lilys' not in ame_list)


# 增加
# append(): 列表结尾追加数据。
# 列表追加数据的时候, 直接在原列表里追加了指定数据, 即修改了原列表, 故列表为可变类型数据
ame_list.append('xiaoming')
print(ame_list)
ame_list.append(['xiaoming','xiaohong'])
print(ame_list)

# extend():列表结尾追加数据, 如果数据是一个序列,则将这个序列的数据逐一添加到列表
ame_list.extend('xiaoxiao')
print(ame_list)
ame_list.extend(['dada','yuyu'])
print(ame_list)


# insert(): 指定位置新增数据
name_list = ['Tom', 'Lily', 'Rose']
name_list.insert(1,'xiaoming')
print(name_list)

# 删除
del name_list[0]
print(name_list)

# pop(): 删除指定下标的数据(默认为最后一个),并返回该数据。
del_name=name_list.pop(1)
print(del_name)

# remove(): 移除列表中某个数据的第一个匹配项。
name_list.remove('Rose')
print(name_list)


# clear(): 清空列表
name_list.clear()
print(name_list)

# 修改指定下标数据
name_list = ['Tom', 'Lily', 'Rose']
name_list[0]='haha'
print(name_list)

# 逆置: reverse()
num_list = [1, 5, 2, 3, 6, 8]
num_list.reverse()
print(num_list)
# 注: 此方法修改原始数据


# 逆置: reversed
res=reversed(num_list)
# 获得一个对象
print(res)
# 将得到的对象转化为列表
wq=list(res)
print(wq)
# 注:1.此方法不会改变原始数据
# 2.获得结果为一个对象,需进行数据类型转化从而获得想要的数据类型

# 排序: sort()
num_list = [1, 5, 2, 3, 6, 8]
# num_list.sort()
# print(num_list)
# 注意:此方法修改原始数据

# 排序:sorted()
res=sorted(num_list)
print(res)
print(num_list)

# copy()
name_list = ['Tom', 'Lily', 'Rose']
name=name_list.copy()
print(name)


#元组数据不支持修改, 只支持查找
# 按下标查找数据
tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1[0])

# index(): 查找某个数据, 如果数据存在返回对应的下标, 否则报错, 语法和列表、字符串的index方法
# 相同
print(tuple1.index('bb'))

# count(): 统计某个数据在当前元组出现的次数
print(tuple1.count('cc'))

# len(): 统计元组中数据的个数。
print(len(tuple1))
# 注意: 元组内的直接数据如果修改则立即报错
# /但是如果元组里面有列表, 修改列表里面的数据则是支持的, 故自觉很重要
tuple2 = (10, 20, ['aa', 'bb', 'cc'], 50, 30)
tuple2[2][0]='oooo'
print(tuple2)

#  增  字典序列[key] = 值
# 注意: 如果key存在则修改这个key对应的值; 如果key不存在则新增此键值对。
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
dict1['name']='wq'
print(dict1)

# del()/del: 删除字典或删除字典中指定键值对。
del dict1['age']
print(dict1)

# clear(): 清空字典
dict1.clear()
print(dict1)

# 改  写法:字典序列[key] = 值
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1['name'])
# 如果当前查找的key存在, 则返回对应的值; 否则则报错


#  get()
print(dict1.get('name'))
print(dict1.get('id',20))
print(dict1.get('id'))

# keys()
print(dict1.keys())

#  values
print(dict1.values())

#  items()
print(dict1.items())

# 遍历字典的key
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for i in dict1.keys():
    print(i)

#  遍历字典的value
for j in dict1.values():
    print(j)

# 遍历字典的元素
for ii in dict1.items():
    print(ii)

# 遍历字典的键值对

for key ,value in dict1.items():
    print(f"{key}={value}")


# 创建集合使用{}或set(), 但是如果要创建空集合只能使用set(),因为{}用来创建空字典。
# 增加数据   add()
s1 = {10, 20}
s1.add(100)
print(s1)
# 因为集合有去重功能, 所以, 当向集合内追加的数据是当前集合已有数据的话, 则不进行任何操作。


# update(),追加的数据是序列。
s1.update([1000,200])
s1.update('abc')
print(s1)

# remove(), 删除集合中的指定数据,如果数据不存在则报错
s1 = {10, 20}
s1.remove(10)
print(s1)

# discard(), 删除集合中的指定数据, 如果数据不存在也不会报错
s1.discard('a')
print(s1)

# pop(), 随机删除集合中的某个数据, 并返回这个数据。
s1 = {10, 20, 30, 40, 50}
re=s1.pop()
print(re)

# in: 判断数据在集合序列
# not in: 判断数据不在集合序列
print(10 in s1)
print(10 not in s1)

# 列表推导式又叫列表生成式
list1=[i for i in range(10)]
print(list1)

# 带if的列表推导式
# 创建0-10的偶数列表
list2 =[i for i in range(10) if i % 2 ==0]
print(list2)

# /多个for循环实现列表推导式
list1 =[(i,j) for i in range(1,3) for j in range(3)]
print(list1)

# 字典推导式
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']
dict1={list1[i]:list2[i] for i in range(len(list2))}
print(dict1)

# 创建一个字典:字典key是1-5数字, value是这个数字的2次方
dict2 ={i :i**2 for i in range(1,5)}
print(dict2)

# 提取上述电脑数量大于等于200的字典数据
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}
count1={k:v for k,v in counts.items() if v >=200}
print(count1)

# 创建一个集合,数据为下方列表的2次方
list1 = [1, 1, 2]
set1={i **2 for i in list1}
print(set1)